home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Priklady / Priklad 37 / A / DETECT37.ASM next >
Assembly Source File  |  2000-08-14  |  4KB  |  110 lines

  1. .386p
  2. .MODEL FLAT,STDCALL
  3. locals
  4. jumps
  5. UNICODE=0
  6. include w32.inc
  7.  
  8. Extrn SetUnhandledExceptionFilter : PROC
  9.  
  10. .data
  11.  
  12. sprava1        db "Ukazka prepnutia do RING0 pomocou LDT",0
  13. sprava2        db "Nastala chyba",0
  14. sprava3        db "Ring0 bol uspesne aktivovany",0
  15.  
  16. odlozESP       dd 0                             ;sem uklada register ESP
  17. predchadzajuca dd 0                             ;sem uklada adresu predchadzajucej obsluhy SEH
  18.  
  19. gdt_           df 0
  20. call_          dd 00
  21.                dw 0Fh
  22. o_gate         dw 0
  23.                dw 028h                          ; segment pre RING0
  24.                dw 0EC00h
  25.                dw 0
  26. .code
  27.  
  28. Start:
  29.  
  30. ;----------------------------------------------------------------------------
  31. ;NASTAVI SEH PRE PRIPAD CHYBY
  32. ;----------------------------------------------------------------------------
  33.                 mov  [odlozESP],esp
  34.                 push offset chyba
  35.                 call SetUnhandledExceptionFilter
  36.                 mov  [predchadzajuca], eax
  37. ;----------------------------------------------------------------------------
  38.  
  39.  
  40.  
  41.                 mov  eax, offset ring0          ;do registra eax da offset nasej obsluhy pre RING0
  42.  
  43.                 mov  [o_gate],ax                ;nastavi adresu nasej novej obsluhy RING0 do nasej "callgate"
  44.                 shr  eax,16
  45.                 mov  [o_gate+6],ax
  46.  
  47.                 xor  eax, eax
  48.                 sgdt fword ptr gdt_             ;ulozi GDT
  49.                 mov  ebx,dword ptr [gdt_+2]     ;ziskame base adresu GDT
  50.                 sldt ax
  51.                 add  ebx,eax                    ;ziskame adresu discriptora
  52.  
  53.                 mov  al,[ebx+4]
  54.                 mov  ah,[ebx+7]
  55.                 shl  eax,16                     ;v registri eax ziskame adresu LDT
  56.  
  57.                 mov  ax,[ebx+2]                 ;pridanim do eax ziskame adresu discriptora callgate
  58.  
  59.                 add  eax,8
  60.                 mov  edi,eax                    ;nastavi sa v callgate na miesto kde zacneme so zmenami
  61.                 mov  esi,offset o_gate          ;do registra esi da adresu nasej "callgate"
  62.                 movsd                           ;a presunie ju do realnej callgate
  63.                 movsd                           ;tym pripravi skok do RING0
  64.  
  65.                 call fword ptr [call_]          ;skok do RING0 na nasu obsluhu
  66.  
  67.                 xor  eax, eax
  68.                 sub  edi,8                      ;nuluje nase zmeny v callgate
  69.                 stosd
  70.                 stosd
  71.  
  72.  
  73. ;----------------------------------------------------------------------------
  74. ;NASTAVI PREDCHADZAJUCU OBSLUHU SEH
  75. ;----------------------------------------------------------------------------
  76.                 push dword ptr [predchadzajuca]
  77.                 call SetUnhandledExceptionFilter
  78. ;----------------------------------------------------------------------------
  79.  
  80.                 jmp  skok                       ;skoci, ak bolo prepnutie do RING0 uspesne
  81.  
  82.  continiue:
  83.                 call MessageBoxA,0, offset sprava2, offset sprava1,0
  84.                 call ExitProcess, -1
  85.  
  86.  
  87. skok:
  88.  
  89.                 call MessageBoxA,0, offset sprava3, offset sprava1,0
  90.                 call ExitProcess, -1
  91.  
  92.  
  93.  
  94. chyba:                                          ;nova obsluha SEH pre pripad chyby
  95.  
  96.                 mov  esp, [odlozESP]
  97.                 push offset continiue
  98.                 ret
  99.  
  100. ;-----------------------------------------------------------------------------
  101. ;NASA NOVA OBSLUHA RING0
  102. ;-----------------------------------------------------------------------------
  103. ring0:
  104.                 mov eax, dr7                    ;tato instrukcia je funkcna iba v RING0
  105.  
  106.                 retf                            ;spat do RING3
  107.  
  108. ends
  109. end Start
  110.